#include "chatitembase.h"
#include <QFont>
#include <QVBoxLayout>
//#include "BubbleFrame.h"

// 构造函数，初始化聊天项基础控件
ChatItemBase::ChatItemBase(ChatRole role, QWidget *parent)
    : QWidget(parent)
    , m_role(role)  // 初始化成员变量 m_role，表示聊天角色（自己或他人）
{
    // 创建并设置用户名标签
    m_pNameLabel = new QLabel();
    m_pNameLabel->setObjectName("chat_user_name");  // 设置对象名称，便于样式表引用
    QFont font("Microsoft YaHei");                  // 设置字体为微软雅黑
    font.setPointSize(9);                           // 字体大小为 9
    m_pNameLabel->setFont(font);                    // 应用字体
    m_pNameLabel->setFixedHeight(20);               // 设置固定高度为 20 像素

    // 创建并设置用户头像标签
    m_pIconLabel = new QLabel();
    m_pIconLabel->setScaledContents(true);          // 允许头像内容缩放
    m_pIconLabel->setFixedSize(42, 42);             // 设置头像固定大小为 42x42 像素

    // 创建消息气泡控件
    m_pBubble = new QWidget();

    // 创建网格布局管理控件排列
    QGridLayout *pGLayout = new QGridLayout();
    pGLayout->setVerticalSpacing(3);                // 设置垂直间距为 3 像素
    pGLayout->setHorizontalSpacing(3);              // 设置水平间距为 3 像素
    pGLayout->setContentsMargins(3, 3, 3, 3);       // 设置布局的四个方向边距均为 3 像素（修复点）

    // 创建占位项，用于拉伸布局
    QSpacerItem *pSpacer = new QSpacerItem(40, 20, QSizePolicy::Expanding, QSizePolicy::Minimum);

    // 根据聊天角色（自己或他人）调整布局
    if (m_role == ChatRole::Self)  // 如果是自己的消息
    {
        m_pNameLabel->setContentsMargins(0, 0, 8, 0);  // 用户名右边距为 8 像素
        m_pNameLabel->setAlignment(Qt::AlignRight);    // 用户名右对齐
        pGLayout->addWidget(m_pNameLabel, 0, 1, 1, 1); // 用户名放在第 0 行，第 1 列
        pGLayout->addWidget(m_pIconLabel, 0, 2, 2, 1, Qt::AlignTop); // 头像放在第 0 行第 2 列，跨 2 行
        pGLayout->addItem(pSpacer, 1, 0, 1, 1);       // 占位项放在第 1 行第 0 列
        pGLayout->addWidget(m_pBubble, 1, 1, 1, 1);    // 气泡放在第 1 行第 1 列
        pGLayout->setColumnStretch(0, 2);              // 第 0 列拉伸因子为 2
        pGLayout->setColumnStretch(1, 3);              // 第 1 列拉伸因子为 3
    }
    else  // 如果是他人的消息
    {
        m_pNameLabel->setContentsMargins(8, 0, 0, 0);  // 用户名左边距为 8 像素
        m_pNameLabel->setAlignment(Qt::AlignLeft);     // 用户名左对齐
        pGLayout->addWidget(m_pIconLabel, 0, 0, 2, 1, Qt::AlignTop); // 头像放在第 0 行第 0 列，跨 2 行
        pGLayout->addWidget(m_pNameLabel, 0, 1, 1, 1); // 用户名放在第 0 行第 1 列
        pGLayout->addWidget(m_pBubble, 1, 1, 1, 1);    // 气泡放在第 1 行第 1 列
        pGLayout->addItem(pSpacer, 2, 2, 1, 1);        // 占位项放在第 2 行第 2 列
        pGLayout->setColumnStretch(1, 3);              // 第 1 列拉伸因子为 3
        pGLayout->setColumnStretch(2, 2);              // 第 2 列拉伸因子为 2
    }
    this->setLayout(pGLayout);  // 将网格布局应用到当前窗口
}

// 设置用户名
void ChatItemBase::setUserName(const QString &name)
{
    m_pNameLabel->setText(name);  // 更新用户名标签的文本
}

// 设置用户头像
void ChatItemBase::setUserIcon(const QPixmap &icon)
{
    m_pIconLabel->setPixmap(icon);  // 更新头像标签的图片
}

// 替换气泡控件
void ChatItemBase::setWidget(QWidget *w)
{
    QGridLayout *pGLayout = qobject_cast<QGridLayout *>(this->layout()); // 获取当前布局
    pGLayout->replaceWidget(m_pBubble, w);  // 替换原来的气泡控件
    delete m_pBubble;                        // 删除旧的气泡控件，释放内存
    m_pBubble = w;                           // 更新气泡指针为新控件
}
